package com.example.springboot.ytest.ytool;


/**
 * 枚举工具类
 * 
 * @author: yeyi
 * @date: 2018年3月25日
 */
public class EnumUtil {
    
    /**
     * 字符串转枚举类型，转换不成功返回 null
     * 类似 enum.valueOf() 但这个不存在会报异常
     * @param s 字符串，区分大小写
     * @param c 枚举的 class
     * @return 字符串不存在返回 null
     */
    public static <T> T fromString(String s, Class<T> c){
        T[] eArray = c.getEnumConstants();
        if( null==eArray ){ // 不是枚举类型
            return null;
        }
        
        for( T t: eArray ){
            if( t.toString().equals(s) ) {
                return t;
            }
        }
        
        return null;
    }
    
    /**
     * 判断 s 是否属于某枚举
     * @param s
     * @param c 枚举的 class
     * @return
     */
    public static <T> boolean isEnum(String s, Class<T> c){
        return null!=fromString(s, c);
    }
    
    /**
     * 判断 s 是否属于某枚举，不是则抛出异常，是则返回枚举类
     * @param s
     * @param c 枚举的 class
     * @return
     */
    public static <T> T check(String s, Class<T> c){
        T t = fromString(s, c);
        if (null==t) {
//            throw new ParamException(StatusCode.ENUM_ERR);
            throw new RuntimeException("EnumUtil check err s: "+s+" class: "+c.getClass());
        }
        return t;
    }
    
    private enum TestEnum { WAX, BUFF }
    
    public static void main(String[] args) {
        String [] sArray = {"WAX2","WAX","","123","BUFF"};
        for(String s: sArray){
            TestEnum action = EnumUtil.fromString(s, TestEnum.class);
            if( null==action ) {
                System.out.println(s + " not a " + TestEnum.class.getSimpleName());
            } else {
                System.out.println(action.toString());
            }
        }
        for(String s: sArray){
            TestEnum action = null;
            try{
                action = TestEnum.valueOf(s);
                System.out.println(action.toString());
            }catch(Exception e){
                System.out.println(s+" not a "+TestEnum.class.getSimpleName());
            }
        }
    }
}
